package bird.spring.com.designpattern.ImageLoader;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;

import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by co-mall on 2015/12/7.
 */
public class ImageLoader {

    // 内存缓存
    ImageCache mImageCache = new ImageCache();
    // SD卡缓存
    DiskCache mDiskCache = new DiskCache();
    // 双缓存
    DoubleCache mDoubleCache = new DoubleCache() ;
    // 使用SD卡缓存
    boolean isUseDiskCache = false;
    // 使用双缓存
    boolean isUseDoubleCache = false;
    // 线程池,线程数量为CPU的数量
    ExecutorService mExecutorService = Executors.newFixedThreadPool (Runtime.getRuntime().availableProcessors());

    // 加载图片
    public  void displayImage(final String url, final ImageView imageView) {
        //①这里没有SD卡缓存时，直接从内存读取缓存
//        Bitmap bitmap = mImageCache.get(url);
        //②如果有了Sd卡的缓存机制时，先判断一下，这种做法有个缺点，就是只有能有一种缓存机制，
        // 要么内部缓存，要么SD卡
//        Bitmap bitmap = isUseDiskCache ? mDiskCache.get(url)
//                : mImageCache.get (url);
//
//        if (bitmap != null) {
//            imageView.setImageBitmap(bitmap);
//            return;
//        }

        //③如果采用了双缓存机制，那么可以考虑以下方法,但现在还是有问题的
        /**
         *每次加新的缓存方法时都要修改原来的代码，这样很可能会引入Bug，而且会使原来的代码逻辑变得越来越
         * 复杂，按照你这样的方法实现，用户也不能自定义缓存实现呀
         */
        Bitmap bmp = null;
        if (isUseDoubleCache) {
            bmp = mDoubleCache.get(url);
        } else if (isUseDiskCache) {
            bmp = mDiskCache.get(url);
        } else {
            bmp = mImageCache.get(url);
        }

        if ( bmp != null ) {
            imageView.setImageBitmap(bmp);
        }

        imageView.setTag(url);
        mExecutorService.submit(new Runnable() {

            @Override
            public void run() {
                Bitmap bitmap = downloadImage(url);
                if (bitmap == null) {
                    return;
                }
                if (imageView.getTag().equals(url)) {
                    imageView.setImageBitmap(bitmap);
                }
                mImageCache.put(url, bitmap);
            }
        });
    }

    public  Bitmap downloadImage(String imageUrl) {
        Bitmap bitmap = null;
        try {
            URL url = new URL(imageUrl);
            final HttpURLConnection conn =
                    (HttpURLConnection)
                            url.openConnection();
            bitmap = BitmapFactory.decodeStream(conn.getInputStream());
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }
    }
